package main

import (
	"log"
	"os"

	"gopkg.in/macaron.v1"
)

// 定义一个interface
type Logger interface {
	Println(...interface{}) // 接收任意类型的变参

}

// 定义一个全局服务
var logger = log.New(os.Stdout, "[APP] ", 0)

// 定义一个请求级别服务
func myLogger(ctx *macaron.Context) {
	var logger = log.New(os.Stdout, "[MyLogger] ", 0)
	ctx.MapTo(logger, (*Logger)(nil)) // 将nil强制转换为接口类型
}

func main() {
	m := macaron.Classic()
	m.Map(logger) // 全局服务Map
	m.Get("/", func(l *log.Logger) {
		l.Println("hello world.") // 打印日志：[APP] hello world.
	})
	// 映射服务到接口，这里的Logger直接传入，不需要使用*
	m.Get("/123", myLogger, func(l Logger) {
		l.Println("hello world.") // 打印日志：[MyLogger] hello world.
	})
	m.Run()

}
